package com.cwnu.sw.cys.core.common.config;
import com.cwnu.sw.cys.core.common.thread.MyThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync
public class ThreadPoolConfig implements AsyncConfigurer {
    /**
     * 项目共用线程池，用于处理核心异步任务。
     */
    public static final String MALLCHAT_EXECUTOR = "mallchatExecutor";

    /**
     * WebSocket通信线程池，用于处理实时消息推送任务。
     */
    public static final String WS_EXECUTOR = "websocketExecutor";

    /**
     * AI聊天处理线程池，用于处理智能对话相关任务。
     */
    public static final String AICHAT_EXECUTOR = "aichatExecutor";

    /**
     * 获取默认的异步任务执行器，使用项目共用线程池。
     *
     * @return 返回项目共用线程池实例。
     */
    @Override
    public Executor getAsyncExecutor() {
        return mallchatExecutor();
    }

    /**
     * 配置项目共用线程池，用于处理核心业务逻辑。
     *
     * 线程池配置：
     * - 核心线程数：10
     * - 最大线程数：10（固定大小线程池）
     * - 队列容量：200（缓冲待处理任务）
     * - 线程名称前缀：mallchat-executor-
     * - 拒绝策略：调用线程执行（保障重要任务不丢失）
     *
     * @return 配置完成的线程池实例。
     */
    @Bean(MALLCHAT_EXECUTOR)
    @Primary
    public ThreadPoolTaskExecutor mallchatExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(200);
        executor.setThreadNamePrefix("mallchat-executor-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.setThreadFactory(new MyThreadFactory(executor));
        executor.initialize();
        return executor;
    }

    /**
     * 配置WebSocket通信线程池，用于处理实时消息推送。
     *
     * 线程池配置：
     * - 核心线程数：16
     * - 最大线程数：16（固定大小线程池）
     * - 队列容量：1000（支持大规模消息推送）
     * - 线程名称前缀：websocket-executor-
     * - 拒绝策略：直接丢弃（非关键性实时消息）
     *
     * @return 配置完成的线程池实例。
     */
    @Bean(WS_EXECUTOR)
    public ThreadPoolTaskExecutor websocketExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(16);
        executor.setMaxPoolSize(16);
        executor.setQueueCapacity(1000);
        executor.setThreadNamePrefix("websocket-executor-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
        executor.initialize();
        return executor;
    }

    /**
     * 配置AI聊天处理线程池，用于处理智能对话请求。
     *
     * 线程池配置：
     * - 核心线程数：10
     * - 最大线程数：10（固定大小线程池）
     * - 队列容量：15（限制任务堆积）
     * - 线程名称前缀：aichat-executor-
     * - 拒绝策略：直接丢弃（保障服务稳定性）
     *
     * @return 配置完成的线程池实例。
     */
    @Bean(AICHAT_EXECUTOR)
    public ThreadPoolTaskExecutor chatAiExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(15);
        executor.setThreadNamePrefix("aichat-executor-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
        return executor;
    }
}
